home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / perlcl16.lha / perlclass1.6 / perlassoc.h < prev    next >
C/C++ Source or Header  |  1992-11-03  |  3KB  |  126 lines

  1. /*
  2.  * Version 1.4
  3.  * Feeble attempt to duplicate perl associative arrays
  4.  * So feeble I won't even call it PerlAssoc!
  5.  * Anyway the key can only be a string, the value can be anything.
  6.  * Written by Jim Morris,  jegm@sgi.com
  7.  */
  8. #ifndef    _PERLASSOC_H
  9. #define _PERLASSOC_H
  10.  
  11. #include <iostream.h>
  12. #include "perlclass.h"
  13.  
  14. template<class T>
  15. class Binar
  16. {
  17. private:
  18.     PerlString k;
  19.     T v;
  20.  
  21. public:
  22.     Binar(PerlString a, T b) : k(a), v(b){}
  23.     Binar(PerlString a) : k(a){}
  24.     Binar(){}
  25.     
  26.     Binar<T>& operator=(const Binar<T>& n){ k= n.k; v= n.v; return *this; }
  27.     PerlString& key(void){ return k; }
  28.     const PerlString& key(void) const { return k; }
  29.     T& value(void){ return v; }
  30.     const T& value(void) const { return v; }
  31.     int operator==(const Binar<T>& b) const{return ((k == b.k) && (v == b.v));}    
  32.     int operator<(const Binar& b) const {return v < b.v;} // to keep sort quiet
  33. };
  34.  
  35. template<class T>
  36. class Assoc
  37. {
  38. private:
  39.     PerlList<Binar<T> > dat;
  40.     Binar<T> def;
  41.     
  42. public:
  43.     Assoc():def(""){}
  44.     Assoc(PerlString dk, T dv) : def(dk, dv){}
  45.  
  46.     int scalar(void) const { return dat.scalar(); }
  47.     
  48.     PerlStringList keys(void);
  49.     PerlList<T> values(void);
  50.     
  51.     int isin(const PerlString& k) const;
  52.     T adelete(const PerlString& k);
  53.         
  54.     T& operator()(const PerlString& k);
  55.     Binar<T>& operator[](int i){ return dat[i]; }
  56. };
  57.  
  58. template<class T>
  59. PerlStringList Assoc<T>::keys(void)
  60. {
  61.     PerlStringList r;
  62.     for(int i=0;i<dat.scalar();i++)
  63.     r.push(dat[i].key());
  64.     return r;
  65. }    
  66.  
  67. template<class T>
  68. PerlList<T> Assoc<T>::values(void)
  69. {
  70.     PerlList<T> r;
  71.     for(int i=0;i<dat.scalar();i++)
  72.     r.push(dat[i].value());
  73.     return r;
  74. }
  75.  
  76. template<class T>
  77. T& Assoc<T>::operator()(const PerlString& k)
  78. {
  79.     for(int i=0;i<dat.scalar();i++){
  80.     if(k == dat[i].key()) return dat[i].value();
  81.     }
  82.     
  83.     dat.push(Binar<T>(k, def.value()));
  84.     return dat[i].value();
  85. }
  86.  
  87. template<class T>
  88. T Assoc<T>::adelete(const PerlString& k)
  89. {
  90.     for(int i=0;i<dat.scalar();i++){
  91.     if(k == dat[i].key()){
  92.         T r= dat[i].value();
  93.         dat.splice(i, 1);
  94.         return r;
  95.     }
  96.     }
  97.     
  98.     return def.value();
  99. }
  100.  
  101. template<class T>
  102. int Assoc<T>::isin(const PerlString& k) const
  103. {
  104.     for(int i=0;i<dat.scalar();i++){
  105.     if(k == dat[i].key()) return i+1;
  106.     }
  107.     return 0;
  108. }
  109.  
  110. template<class T>
  111. ostream& operator<<(ostream& os, Binar<T>& a)
  112. {
  113.     os << "(" << a.key() << ", " << a.value() << ")";
  114.     return os;
  115. }
  116.  
  117. template<class T>
  118. ostream& operator<<(ostream& os, Assoc<T>& a)
  119. {
  120.     for(int i=0;i<a.scalar();i++){
  121.     os << "[" << i << "] " << a[i] << endl;
  122.     }
  123.     return os;
  124. }
  125. #endif
  126.